package com.easypan.component;

import com.easypan.entity.constants.Constants;
import com.easypan.entity.dto.DownloadFileDto;
import com.easypan.entity.dto.SessionwebUserDto;
import com.easypan.entity.dto.UserSpaceDto;
import com.easypan.entity.po.UserInfo;
import com.easypan.entity.vo.R;
import com.easypan.mapper.FileInfoMapper;
import com.easypan.mapper.UserMapper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component("redisComponent")
public class redisComponent {
    @Resource
    private RedisUtils redisUtils;

    @Resource
    private FileInfoMapper fileInfoMapper;
    @Resource
    private UserMapper userMapper;
/*
    public SysSettingsDto getSysSettingsDto() {
        SysSettingsDto sysSettingsDto = (SysSettingsDto) redisUtils.get(Constants.REDIS_KEY_SYS_SETTING);
        if (null == sysSettingsDto) {
            //如果没有就new一个，new出来的会存在初始值
            sysSettingsDto = new SysSettingsDto();
            //再放进缓存中,不设置就过期时间
            redisUtils.set(Constants.REDIS_KEY_SYS_SETTING, sysSettingsDto);
        }
        return sysSettingsDto;
    }
*/
///邮件redis读取
   /// 设置redis
    /*
public void saveSysSettingsDto(SysSettingsDto sysSettingsDto) {
    redisUtils.set(Constants.REDIS_KEY_SYS_SETTING, sysSettingsDto);
}
    */
///自己给id 和查询空间
    public void saveUserSpace(String userId, UserSpaceDto userSpaceDto) {
        //这是设置过期时间的方法,键定义为
        redisUtils.setex(Constants.REDIS_KEY_USER_SPACE_USE + userId, userSpaceDto, Constants.REDIS_KEY_EXPIRES_DAY);
    }

    //// 通过userid 设置redis  --场景直接从user 中拿 比如我们更新好了 直接拿即可
    public UserSpaceDto resetUserSpaceUse(int userId) {
        UserSpaceDto userSpaceDto = new UserSpaceDto();
        UserInfo userInfo = userMapper.selectByuserid(userId);
        userSpaceDto.setUseSpace(userInfo.getUseSpace());
        userSpaceDto.setTotalSpace(userInfo.getTotalSpace());
        redisUtils.setex(Constants.REDIS_KEY_USER_SPACE_USE + userId, userSpaceDto, Constants.REDIS_KEY_EXPIRES_DAY);
        return userSpaceDto;
    }
    public UserSpaceDto getUserSpaceUsekj(int userId) {
        UserSpaceDto userSpaceDto = (UserSpaceDto) redisUtils.get(Constants.REDIS_KEY_USER_SPACE_USE + userId);
      if(userSpaceDto==null)
      {
          return new UserSpaceDto();
      }
        return userSpaceDto;
    }
    public UserSpaceDto getUserSpaceUse(String userId) {
        UserSpaceDto userSpaceDto = (UserSpaceDto) redisUtils.get(Constants.REDIS_KEY_USER_SPACE_USE + userId);
        if (null == userSpaceDto) {
            userSpaceDto = new UserSpaceDto();
            // 这里需要查用户使用了多少空间,即上传文件的大小总空间
          //  userSpaceDto.setUseSpace(fileInfoMapper.selectUseSpace(userId));
            //从存在的用户中查询用户的空间大小，转化为MB格式
          //  userSpaceDto.setTotalSpace(getSysSettingsDto().getUserInitUseSpace() * Constants.MB);
            saveUserSpace(userId, userSpaceDto);
        }
        return userSpaceDto;
    }

    public Long getFileTempSize(int userId, String fileId) {
        //返回现在空间的大小
        Long currentSize = getFileSizeFromRedis(Constants.REDIS_KEY_USER_FILE_TEMP_SIZE + userId + fileId);
        return currentSize;
    }

    public Long getFileSizeFromRedis(String key) {
        Object size = redisUtils.get(key);
        if(null==size)
        {
            return  0l;
        }
        if(size instanceof  Integer)
        {
            return ((Integer)size).longValue();
        }else if(size instanceof  Long)
        {
            return  (Long)  size;
        }
        return 0l;
    }

    //设置redis的值--将分片大小进行叠加的
    public void saveFileTempSize(String userId, String fileId, Long fileSize) {
        //获取存储在键中的空间
        Long currentSize = getFileTempSize(Integer.parseInt(userId), fileId);
        //再将新空间与原空间相加，设置过期时间为一个小时

        redisUtils.setex(Constants.REDIS_KEY_USER_FILE_TEMP_SIZE + userId + fileId, currentSize + fileSize, Constants.REDIS_KEY_EXPIRES_ONE_HOUR);

    }

    public void saveDownloadFile(String code, DownloadFileDto downloadFileDto) {
        /**
         * 这里的key设置成easypan:download: + code,值就是DownloadFileDto对象
         */
        redisUtils.setex(Constants.REDIS_KEY_DOWNLOAD + code, downloadFileDto, Constants.REDIS_KEY_EXPIRES_FIVE_MIN);
    }

    public Object getDownloadFile(String code, SessionwebUserDto webUserDto) {

        Object o = redisUtils.get(Constants.REDIS_KEY_DOWNLOAD + code);

        return o;
    }
    public Object getDownloadFile(String code) {

        Object o = redisUtils.get(Constants.REDIS_KEY_DOWNLOAD + code);

        return o;
    }
}
